<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // ...args 代表着不确定会接受多少个参数
        var foo = function(...args){
            if(!Array.isArray(foo.arr)){
                foo.arr = [];
            }
            // 利用解构一个一个push进数组内
            foo.arr.push(...args);
            // 返回当前函数名的引用 可以多次在同位置调用 
            // 这样就是链式调用 
            return foo;
        }
        // 在原型链上创建一个方法 用于返回累加值
        Function.prototype.getValue = () => {
            // 返回一个reduce方法的调用 传入对应的内容
            // reduce() 方法对数组中的每个元素执行一个由您提供的reduce函数(升序执行)
            // 将其结果汇总为单个返回值  reduce方法可做的事情特别多  
            // 就是循环遍历能做的 reduce都可以做 
            // 比如数组求和 数组求积 数组中元素出现的次数 数组去重等等
            // 语法:
            // arr.reduce(function(pre,cur,index,arr){
            //     ...
            // },init);
            // 参数:
            // prev 必需。累计器累计回调的返回值; 表示上一次调用回调时的返回值，或者初始值 init;
            // cur 必需。表示当前正在处理的数组元素；
            // index 可选。表示当前正在处理的数组元素的索引，若提供 init 值，则起始索引为- 0，否则起始索引为1；
            // arr 可选。表示原数组；
            // init 可选。表示初始值。
            return foo.arr.reduce((pre,cur) => {
                return pre + cur;
            },0);
        }
        var f1 = foo(1)(4,5);
        console.log(f1.getValue());
    </script>
</body>
</html>